package interfejsKlient;

import informacja.PracownikDworca;
import interfejsPracownik.ServiceDodajPolaczenie;
import interfejsPracownik.ServicePobierzPrzewoznikow;
import interfejsPracownik.ServiceSprzedajBilet;
import interfejsPracownik.ServiceZaloguj;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javafx.animation.FadeTransition;
import javafx.animation.FadeTransitionBuilder;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.util.Duration;
import uzytkownik.ZalogowanyPasazer;

public class ManagerPaneli {
	final static int ZLA_DLUGOSC = 1;
	final static int NIEPOPRAWNE_IMIE = 2;
	final static int ZACZYNA_SIE_OD_ZNAKU = 3;
	final static int ROZNE_HASLA = 4;
	final static int NIEPOPRAWNY_PESEL = 5;
	final static int OK = 6;
	public static TableView<PolaczenieItem> polaczenia;
	public static PracownikDworca zalogowanyPracownik;
	//public static Button loguj = new Button("Loguj");
	public static Button wyloguj = new Button("Wyloguj");
	public static BorderPane mainPanel;
	public static ArrayList<MainPane> stosPaneli = new ArrayList<MainPane>();
	public static Button rejestruj;
	public static boolean czyZalogowano =false;
	public static ServiceZaloguj serviceZalogujPracownika = new ServiceZaloguj();
	public static ServiceZalogujPasazera serviceZaloguj = new ServiceZalogujPasazera();
	public static ServiceZarezerwuj serviceRezerwuj = new ServiceZarezerwuj();
	public static ServicePobierzPolaczenia servicePobierzPolaczenia = new ServicePobierzPolaczenia();
	public static ServicePobierzPrzewoznikow servicePobierzPrzewoznikow = new ServicePobierzPrzewoznikow();
	public static ServiceSprzedajBilet serviceSprzedaj = new ServiceSprzedajBilet();
	public static ServiceDodajPolaczenie serviceDodajPolaczenie = new ServiceDodajPolaczenie();
	public static ServiceDodajPrzewoznika serviceDodajPrzewoznika = new ServiceDodajPrzewoznika();
	public static ZalogowanyPasazer zalogowanyPasazer;
	public static HBox prawyBox;
	public static PasswordField hasloField;
	public static TextField loginField = new TextField();
	public static boolean czyTrwa = false;
	
	public static boolean sprawdzGodzine(String godzina, String minuta){

        //jelsi ktorys stirng pusty, to false:

        if((godzina.length() == 0) || (minuta.length() == 0))

                return false;

        

        //szukamy wszystkiego co nie jest cyframi 0-9

        Pattern p = Pattern.compile("[^0-9]");

        //sprawdzenie godziny

        Matcher matcher = p.matcher(godzina);

        

        //jesli znaleziono, to false

        if(matcher.find()){

                //System.out.println("wololo: " + matcher.start());

                return false;}

        

        //to samo dla minut

        matcher = p.matcher(minuta);

        

        //jesli znaleziono, to false

        if(matcher.find())

                return false;

        

        //jesli wsyzstko ok, to parsujemy

        int h = Integer.parseInt(godzina);

        int m = Integer.parseInt(minuta);

        

        //sprawdzamy czy sie miesci w zegarku

        if( h >= 24 || h < 0)

                return false;

        if( m >= 60 || m < 0)

                return false;

        

        //jesli wsyzstko ok to konczymy

        return true;

}
	
	
	public static void dodajButton(Button button){
		prawyBox.getChildren().add(0, button);
	}
	
	public static int sprawdzPoprawnoscRejestracji(String login, String haslo,

            String powtorzHaslo, String imie, String nazwisko, String pesel) {

    //int wynik  = OK;

    

    //zalozniea poczatkowe

    int maxDlugoscHasla = 20;

    int minDlugoscHasla = 6;

    int maxDlugoscLoginu = 20;

    int minDlugoscLoginu = 6;

    

    // ***  najpierw login ***

    if(login.contains(" "))

            return ZACZYNA_SIE_OD_ZNAKU;

    

    

    if((login.length() > maxDlugoscLoginu) || (login.length()< minDlugoscLoginu))

            return ZLA_DLUGOSC;

    Pattern p = Pattern.compile("[0-9]");

    Matcher m2 = p.matcher(login.charAt(0)+ "");

    if(m2.find())

            return ZACZYNA_SIE_OD_ZNAKU;

    

    

    //*** teraz hasla ***

    if(!haslo.equals(powtorzHaslo))

            return ROZNE_HASLA;

    //jesli byly takie same, to mozna teraz sie zajac ich innymi warunkami

    if( (haslo.length() > maxDlugoscHasla) || (haslo.length() < minDlugoscHasla) )

            return ZLA_DLUGOSC;

    

    

    // *** PESEL ***

    if(pesel.length() != 11)

            return NIEPOPRAWNY_PESEL;

    //if(pesel.matches("[0-9]"));

    //szukamy liter az, AZ lub spacji lub znakow specjalnych

    Pattern alfabet = Pattern.compile("^[0-9]");

    Matcher m = alfabet.matcher(pesel);

    //jesli znajdzie litere w numerze pesel

    if(!m.find())

            return NIEPOPRAWNY_PESEL;

    

    //imie i nazwisko

    

    if(imie.length() == 0)

            return ZLA_DLUGOSC;

    if(nazwisko.length() == 0)

            return ZLA_DLUGOSC;

    

    Pattern liczby = Pattern.compile("^[a-zA-Z]");

    m = liczby.matcher(imie);

    if(! m.find())

            return NIEPOPRAWNE_IMIE;

    m = liczby.matcher(nazwisko);

    if(!m.find())

            return NIEPOPRAWNE_IMIE;

    

    

    

    return OK;

}//koniec sprawdzPoprawnoscRejestracji

	public static void startAnimationOnCurrent(int type, String komunikat){
		MainPane pane = stosPaneli.get(stosPaneli.size()-1);
		pane.wyswietlKomunikat(type, komunikat);
		
	}//koniec staron C
	public static void startAnimationOnPrevious(int type, String komunikat){
		MainPane pane = stosPaneli.get(stosPaneli.size()-2);
		pane.wyswietlKomunikat(type, komunikat);
		
	}
	
	public static void goToFirst(){
		if(czyTrwa == false){
			czyTrwa = true;
			MainPane znikajace = stosPaneli.get(stosPaneli.size()-1);
			MainPane pojawiajace = stosPaneli.get(0);
			stosPaneli = new ArrayList<MainPane>();
			stosPaneli.add(pojawiajace);
			
			FadeTransition fade = FadeTransitionBuilder.create()
		            .duration(Duration.seconds(0.2))
		            .node(znikajace)
		            .fromValue(1)
		            .toValue(0)
		            .cycleCount(1)
		            .autoReverse(false)
		            .build();
			
			fade.play();
			
			fade.setOnFinished(new EventHandler<ActionEvent>(){

				@Override
				public void handle(ActionEvent event) {
					
					
					
					MainPane pojawiajace = stosPaneli.get(0);
					pojawiajace.setOpacity(0);
					mainPanel.setCenter(pojawiajace);
					
					FadeTransition fade2 = FadeTransitionBuilder.create()
				            .duration(Duration.seconds(0.2))
				            .node(pojawiajace)
				            .fromValue(0)
				            .toValue(1)
				            .cycleCount(1)
				            .autoReverse(false)
				            .build();
					
					fade2.play();
					
					fade2.setOnFinished(new EventHandler<ActionEvent>(){

						@Override
						public void handle(ActionEvent event) {
							czyTrwa = false;
						}
					});
					//mainPanel.setCenter(stosPaneli.get(stosPaneli.size()-1));
				}
				
			});
		}else{
			
		}
		
	}//koniec goToFirst
	
	public static void back(){
		if(czyTrwa == false){
			czyTrwa = true;
			MainPane znikajace = stosPaneli.get(stosPaneli.size()-1);
			FadeTransition fade = FadeTransitionBuilder.create()
		            .duration(Duration.seconds(0.2))
		            .node(znikajace)
		            .fromValue(1)
		            .toValue(0)
		            .cycleCount(1)
		            .autoReverse(false)
		            .build();
			
			fade.play();
			
			fade.setOnFinished(new EventHandler<ActionEvent>(){

				@Override
				public void handle(ActionEvent event) {
					
					
					stosPaneli.remove(stosPaneli.size()-1);
					MainPane pojawiajace = stosPaneli.get(stosPaneli.size()-1);
					pojawiajace.setOpacity(0);
					mainPanel.setCenter(pojawiajace);
					FadeTransition fade2 = FadeTransitionBuilder.create()
				            .duration(Duration.seconds(0.2))
				            .node(pojawiajace)
				            .fromValue(0)
				            .toValue(1)
				            .cycleCount(1)
				            .autoReverse(false)
				            .build();
					
					fade2.play();
					czyTrwa = false;
					
					//mainPanel.setCenter(stosPaneli.get(stosPaneli.size()-1));
				}
				
			});
		}
		
		
	}//koniec back
	
	public static void next(final MainPane panel){
		
		if(czyTrwa == false){
				czyTrwa = true;
			if(stosPaneli.size() < 1){
				//jeden element wiec nic nie usuwamy

				stosPaneli.add(panel);
				panel.setOpacity(0);
				mainPanel.setCenter(panel);
				//System.out.println("Mniejsze lub = 1");
				FadeTransition fade = FadeTransitionBuilder.create()
			            .duration(Duration.seconds(0.2))
			            .node(panel)
			            .fromValue(0)
			            .toValue(1)
			            .cycleCount(1)
			            .autoReverse(false)
			            .build();
				
				fade.play();
				
				fade.setOnFinished(new EventHandler<ActionEvent>(){

					@Override
					public void handle(ActionEvent event) {
						czyTrwa = false;
					}
				});
				
			}else{
				
				
				MainPane current = stosPaneli.get(stosPaneli.size()-1);
				FadeTransition fade2 = FadeTransitionBuilder.create()
			            .duration(Duration.seconds(0.2))
			            .node(current)
			            .fromValue(1)
			            .toValue(0)
			            .cycleCount(1)
			            .autoReverse(false)
			            .build();
				
				fade2.play();
				
				fade2.setOnFinished(new EventHandler<ActionEvent>(){

					@Override
					public void handle(ActionEvent event) {
						czyTrwa = false;
						stosPaneli.add(panel);
						panel.setOpacity(0);
						mainPanel.setCenter(panel);
						FadeTransition fade = FadeTransitionBuilder.create()
					            .duration(Duration.seconds(0.2))
					            .node(panel)
					            .fromValue(0)
					            .toValue(1)
					            .cycleCount(1)
					            .autoReverse(false)
					            .build();
						
						fade.play();
						
						
					}
					
				});
			}//koniec else
		}
		
		
	}//koniec next
	
	public static boolean sprawdz(int dzien, int miesiac, int rok, String godzina){

        //sprawdzamuy czy godizna nie jest pustym stringime

        if(godzina.length() != 5) //bo staly format godizny GG:MM

                return false;

        

        

        //potem sprawdzamy poprawnosc zadanej daty

        if(!sprawdz(dzien,miesiac,rok))

                return false;

        

        //na sam koniec godzina, najpierw jej format

        Pattern p = Pattern.compile("^[0-2][0-9]:[0-5][0-9]");

        //sprawdzenie godziny

        Matcher matcher = p.matcher(godzina);

        //jesli format byl inny niz zakladany

        if(!matcher.find())

                return false;

        

        //jesli format byl ok to parsujemy

        int g = Integer.parseInt(godzina.substring(0, 2));

        int m = Integer.parseInt(godzina.substring(3));

        

        

        //jesli godzina przypadkiem wyszla wieksza niz 23, to blad

        if(g > 23)

                return false;

        

        //jesli ok to porwnujemy z obecna godzina, jesli podana data

        // to data dzisiejsza

        Calendar c = Calendar.getInstance();

        

        if(c.get(Calendar.DATE) == dzien){

                int g2 = c.get(Calendar.HOUR_OF_DAY);

                int m2 = c.get(Calendar.MINUTE);

                

                //jesli podana godizne ktora juz uplyenla, albo ktora jest obecnie

                if(g <= g2)

                        return false;

                //jesli natomiast godzina jest ok, to sprawdzamy czy minut jest wiecej niz 60

                if(g == (g2+1))//jesli podalismy godizne pozniejsza niz nastepna, to na bank bedzie wiecej niz 60 minut

                        if(m <= m2)

                                return false;

        }

        

        //jak wsystko ok, to true

        return true;

        

}
	
	public static boolean sprawdz(int dzien, int miesiac, int rok){

        

        Calendar c = Calendar.getInstance();

        Calendar c2 = Calendar.getInstance();

        

        //ustawiamy kalendarz dla zadanej daty, aby dowiedziec sie

        //ile dni ma ten miesiac w tym roku

        c2.set(Calendar.YEAR, rok);

        c2.set(Calendar.MONTH, miesiac);

        

        //najpierw sprawdzimy czy nie mamy danych z dupy

        if(dzien <= 0 || dzien > c2.getActualMaximum(Calendar.DATE))

                return false;

        if(miesiac < 0 || miesiac > 11)

                return false;

        if(rok <= 0)

                return false;

        

        //jesli podany rok mniejszy od obecnego, to false

        if(rok < c.get(Calendar.YEAR))

                return false;

        //jesli miesiac mniejszy od tego w obecnym roku, to false

        if( miesiac < c.get(Calendar.MONTH))

                return false;

        //jesli dzien miesiaca mniejszy od aktualnego, to false

        if(dzien < c.get(Calendar.DAY_OF_MONTH))

                return false;

        

        //jesli wszystko poszlo tak jak trzeba

        return true;

        

}
	
	public static void activeRejestruj(){
		rejestruj.setDisable(false);
	}
	
}//koniec klasy
